package org.jsola.hr.service.impl;

import org.jsola.common.DateKit;
import org.jsola.core.Page;
import org.jsola.hr.common.ExampleKit;
import org.jsola.hr.constant.HrConstants;
import org.jsola.hr.dao.ITemplateFieldDAO;
import org.jsola.hr.dao.ITemplateInfoDAO;
import org.jsola.hr.dto.TemplateFieldAddDTO;
import org.jsola.hr.dto.TemplateFieldUpdateDTO;
import org.jsola.hr.dto.TemplateInfoAddDTO;
import org.jsola.hr.dto.TemplateInfoUpdateDTO;
import org.jsola.hr.entity.TemplateFieldDO;
import org.jsola.hr.entity.TemplateInfoDO;
import org.jsola.hr.query.TemplateInfoQuery;
import org.jsola.hr.service.ITemplateInfoService;
import org.jsola.hr.vo.TemplateInfoListVO;
import org.jsola.hr.vo.TemplateInfoVO;
import org.jsola.user.core.TokenUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author zhr
 */
@Service("hrTemplateInfoServiceImpl")
public class TemplateInfoServiceImpl implements ITemplateInfoService {

    @Autowired
    private ITemplateInfoDAO templateInfoDAO;

    @Autowired
    private ITemplateFieldDAO templateFieldDAO;

    @Override
    @Transactional(value = HrConstants.TX, rollbackFor = Exception.class)
    public TemplateInfoVO save(TemplateInfoAddDTO templateInfoAddDTO, TokenUser tokenUser) {
        // 转DO
        TemplateInfoDO templateInfoDO = templateInfoAddDTO.to(TemplateInfoDO.class);
        // 保存
        templateInfoDO = save(templateInfoDO, tokenUser.getSiteId(), tokenUser.getUserId());

        List<TemplateFieldAddDTO> templateFieldAddDTOList = templateInfoAddDTO.getTemplateFieldAddDTOList();
        TemplateInfoDO finalTemplateInfoDO = templateInfoDO;
        Date now = DateKit.getToday();
        System.out.println(now + "----------------------" + DateKit.getTodayAndTime());
        if(!CollectionUtils.isEmpty(templateFieldAddDTOList)){
            List<TemplateFieldDO> templateFieldDOList = templateFieldAddDTOList.stream().map(templateFieldAddDTO -> {
                templateFieldAddDTO.setTemplateId(finalTemplateInfoDO.getId());
                TemplateFieldDO templateFieldDO = templateFieldAddDTO.to(TemplateFieldDO.class);
                templateFieldDO.setSiteId(finalTemplateInfoDO.getSiteId());
                templateFieldDO.setGmtCreate(now);
                templateFieldDO.setCreateUserId(tokenUser.getUserId());
                return templateFieldDO;
            }).collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(templateFieldDOList)){
                templateFieldDAO.insertListAndSetId(templateFieldDOList);
            }
        }
        return templateInfoDO.to(TemplateInfoVO.class);
    }

    @Override
    @Transactional(value = HrConstants.TX, rollbackFor = Exception.class)
    public int update(TemplateInfoUpdateDTO templateInfoUpdateDTO, TokenUser tokenUser) {
        Date now = DateKit.getToday();
        //转DO
        TemplateInfoDO templateInfoDO = templateInfoUpdateDTO.to(TemplateInfoDO.class);
        templateInfoDO.setGmtModified(now);
        //修改模板字段集合
        List<TemplateFieldUpdateDTO> templateFieldUpdateDTOList = templateInfoUpdateDTO.getTemplateFieldUpdateDTOList();
        TemplateFieldDO templateFieldDO = new TemplateFieldDO();
        templateFieldDO.setTemplateId(templateInfoUpdateDTO.getId());
        templateFieldDAO.delete(templateFieldDO);
        if(!CollectionUtils.isEmpty(templateFieldUpdateDTOList)){
            List<TemplateFieldDO> templateFieldDOList = templateFieldUpdateDTOList.stream().map(templateFieldUpdateDTO -> {
                TemplateFieldDO templateFieldDOTmp = templateFieldUpdateDTO.to(TemplateFieldDO.class);
                templateFieldDOTmp.setSiteId(tokenUser.getSiteId());
                templateFieldDOTmp.setCreateUserId(tokenUser.getUserId());
                templateFieldDOTmp.setGmtCreate(now);
                return templateFieldDOTmp;
            }).collect(Collectors.toList());
            templateFieldDAO.insertListAndSetId(templateFieldDOList);
        }
        //根据主键更新，只更新非null值
        return updateByIdSelective(templateInfoDO, tokenUser.getSiteId(), tokenUser.getUserId());
    }

    @Override
    @Transactional(value = HrConstants.TX, rollbackFor = Exception.class)
    public int deleteByIds(TokenUser tokenUser, String... templateInfoIds) {
        return logicalDeleteByIds(tokenUser.getSiteId(), tokenUser.getUserId(), (Object[]) templateInfoIds);
    }


    @Override
    public TemplateInfoVO selectById(String templateInfoId, String siteId) {
        TemplateInfoDO templateInfoDO = selectDOById(templateInfoId, siteId);
        if (templateInfoDO == null) {
            return null;
        }
        return templateInfoDO.to(TemplateInfoVO.class);
    }

    @Override
    public List<TemplateInfoListVO> select(TemplateInfoQuery templateInfoQuery, String siteId) {
        List<TemplateInfoDO> templateInfoDOList = selectDO(templateInfoQuery, siteId);
        if(CollectionUtils.isEmpty(templateInfoDOList)) {
            return templateInfoDOList == null ? null : new ArrayList<>();
        }
        return templateInfoDOList.stream()
                .map(templateInfoDO -> templateInfoDO.to(TemplateInfoListVO.class))
                .collect(Collectors.toList());
    }

    @Override
    public int selectCount(TemplateInfoQuery templateInfoQuery, String siteId) {
        Example example = buildExample(templateInfoQuery,siteId);
        return templateInfoDAO.selectCountByExample(example);
    }

    @Override
    public Page<TemplateInfoListVO> selectPage(TemplateInfoQuery templateInfoQuery, String siteId) {
        Example example = buildExample(templateInfoQuery,siteId);
        Page<TemplateInfoDO> page = templateInfoDAO.selectPageByExample(example,
                templateInfoQuery.getPageNo(),
                templateInfoQuery.getPageSize());

        return page.to(TemplateInfoListVO.class);
    }

    @Override
    public TemplateInfoDO selectDOById(String templateInfoId, String siteId) {
        return listById(templateInfoId, siteId);
    }

    @Override
    public List<TemplateInfoDO> selectDO(TemplateInfoQuery templateInfoQuery, String siteId) {
        Example example = buildExample(templateInfoQuery,siteId);
        return templateInfoDAO.selectByExample(example);
    }


    /**
     * 根据查询参数，构建example

     * @param templateInfoQuery 查询参数
     * @param siteId 所属站点id
     * @return example
     */
    private Example buildExample(TemplateInfoQuery templateInfoQuery, String siteId) {
        Example example = new Example(TemplateInfoDO.class);
        example.and()
                .andEqualTo("valid", true)
                .andEqualTo("siteId", siteId);
        if (templateInfoQuery.getType() != null) {
            example.and().andEqualTo("type", templateInfoQuery.getType());
        }
        if (templateInfoQuery.getName() != null) {
            example.and().andLike("name", "%" + templateInfoQuery.getName() + "%");
        }
        if (templateInfoQuery.getContent() != null) {
            example.and().andLike("content", "%" + templateInfoQuery.getContent() + "%");
        }
        if (templateInfoQuery.getCompanyId() != null) {
            example.and().andEqualTo("companyId", templateInfoQuery.getCompanyId());
        }
        if (templateInfoQuery.getGmtCreateStart() != null &&
                templateInfoQuery.getGmtCreateEnd() != null) {
            example.and().andBetween("gmtCreate", templateInfoQuery.getGmtCreateStart(),
                    templateInfoQuery.getGmtCreateEnd());
        }
        if (templateInfoQuery.getCreateUserId() != null) {
            example.and().andLike("createUserId", "%" + templateInfoQuery.getCreateUserId() + "%");
        }
        if (templateInfoQuery.getGmtModifiedStart() != null &&
                templateInfoQuery.getGmtModifiedEnd() != null) {
            example.and().andBetween("gmtModified", templateInfoQuery.getGmtModifiedStart(),
                    templateInfoQuery.getGmtModifiedEnd());
        }
        if (templateInfoQuery.getModifiedUserId() != null) {
            example.and().andLike("modifiedUserId", "%" + templateInfoQuery.getModifiedUserId() + "%");
        }
        // 排序
        ExampleKit.setExampleOrder(example,templateInfoQuery.getOrders());
        return example;
    }
}




